package com.itheima.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.common.R;
import com.itheima.reggie.entity.Category;
import com.itheima.reggie.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

// 分类控制器 - 分类的增删改查
@RestController
@Slf4j
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    // 新增分类的控制器方法 -restful
    // 方法：返回值 方法名(参数列表）
    @PostMapping
    public R<String> save(@RequestBody Category category){
        log.info("[保存分类:{}]",category);
        // 调用Service保存分类
        // 此时缺少CategoryService CategoryMapper
        categoryService.save(category);
        return R.success("新增分类成功");
    }

    @GetMapping("/page")
    // Page这个苞米豆提供的，直接返回给前端了
    public R<Page> findByPage(Integer page,Integer pageSize){
        log.info("[分页查询分类 page:{} pageSize:{}]",page,pageSize);
        // 分页查询
        // 1.构建page对象，此时把当前页面和每页条数给page对象
        Page<Category> pageInfo = new Page<>(page,pageSize);
        // 2.调用service分页查询,有带条件的，有不带条件的
        // order by sort desc
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();
        // 按sort倒叙，sort值越高，显示越靠前
        queryWrapper.orderByDesc(Category::getSort);
        categoryService.page(pageInfo,queryWrapper);
        return R.success(pageInfo);
    }
    // 返回值 方法名(参数列表),查询传参的时候，每个值是字符串
    @DeleteMapping
    public R<String> delete(String id){
        log.info("[删除分类 id:{}]",id);
        // 调用service，删除是物理删除，但是比较危险，如果这个分类在使用，也会给删除的
        // 正常来讲，如果被删除的分类，正在使用，不能被删除
        // MP提供的基于ID，不会考虑额外因素，如果我们需要考虑额外因素，不能使用MP提供方法
        //categoryService.removeById(id);
        // 调用我们自己定义的业务方法，来完成分类的删除
        categoryService.removeCategory(id);
        return R.success("删除分类成功");
    }

    @PutMapping
    public R<String> update(@RequestBody Category category){
        log.info("[更新分类:{}]",category);
        // 调用Service
        categoryService.updateById(category);
        return R.success("修复分类成功");
    }
    // 分类列表的展示，根据type(1菜品分类，2套餐分类）
    @GetMapping("/list")
    public R<List<Category>> list(Category category){
        log.info("[分类的展示 category:{}]",category);
        // 调用service,根据条件获取数据
        // select * from category where type = 1 order by sort,update_time desc;
        LambdaQueryWrapper<Category> queryWrapper = new LambdaQueryWrapper();
        // 如果type !=null 我们基于条件查询
        queryWrapper.eq(category.getType()!=null,Category::getType,category.getType());
        queryWrapper.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);
        List<Category> categoryList = categoryService.list(queryWrapper);
        return R.success(categoryList);
    }

}
